/**
 * @File Name: httprequest.h
 * @brief  解析HTTP请求的类
 * @Author : beyon_sir email:caoboyang.chn@gmail.com
 * @Version : 1.0
 * @Create Date : 2022-11-21
 * 
 */
#ifndef HTTP_REQUEST_H
#define HTTP_REQUEST_H

#include <unordered_map>
#include <unordered_set>
#include <string>
#include <regex>
#include <errno.h>     
#include <mysql/mysql.h>  //mysql

#include "../buffer/buffer.h"
#include "../log/log.h"
#include "../pool/sqlconnpool.h"
#include "../pool/sqlconnRAII.h"

class HttpRequest {
public:
    enum PARSE_STATE {
        REQUEST_LINE,       // 正在解析请求首行
        HEADERS,            // 正在解析请求头
        BODY,               // 正在解析请求体
        FINISH,             // 解析请求完成
    };

    enum HTTP_CODE {
        NO_REQUEST = 0,              
        GET_REQUEST,
        BAD_REQUEST,
        NO_RESOURSE,
        FORBIDDENT_REQUEST,
        FILE_REQUEST,
        INTERNAL_ERROR,
        CLOSED_CONNECTION,
    };
    
    HttpRequest() { Init(); }
    ~HttpRequest() = default;

    void Init();
    bool parse(Buffer& buff);

    std::string path() const;
    std::string& path();
    std::string method() const;
    std::string version() const;
    std::string GetPost(const std::string& key) const;
    std::string GetPost(const char* key) const;

    bool IsKeepAlive() const;                               // 是否保持连接

    /* 
    todo 
    void HttpConn::ParseFormData() {}
    void HttpConn::ParseJson() {}
    */

private:
    bool ParseRequestLine_(const std::string& line);        // 解析请求首行
    void ParseHeader_(const std::string& line);             // 解析请求头
    void ParseBody_(const std::string& line);               // 解析请求体

    void ParsePath_();                                      // 解析请求路径
    void ParsePost_();                                      // post请求
    void ParseFromUrlencoded_();                            // 解析表单数据

    static bool UserVerify(const std::string& name, const std::string& pwd, bool isLogin);  // 验证用户登录

    PARSE_STATE state_;                                     // 当前解析的状态
    std::string method_, path_, version_, body_;            // 请求方法，请求路径，协议版本，请求体
    std::unordered_map<std::string, std::string> header_;   // 请求头(键值对)
    std::unordered_map<std::string, std::string> post_;     // post请求表单数据

    static const std::unordered_set<std::string> DEFAULT_HTML;          // 默认的网页HTML
    static const std::unordered_map<std::string, int> DEFAULT_HTML_TAG; // 
    static int ConverHex(char ch);                          // 转换成16进制
};


#endif //HTTP_REQUEST_H